package com.runjian.rundo.iot.agent.iec104.parser.frame;

import java.util.Date;

import cn.hutool.core.date.DatePattern;
import cn.hutool.core.date.DateUtil;
import lombok.*;

/**
 * 信息体包装类
 *
 * @author byw
 * @date 2025/05/27
 */
@AllArgsConstructor
@NoArgsConstructor
@Builder
@Getter
@Setter
public class InfoElement<T> implements Frame {

    /**
     * 信息元素地址 必须, 信息对象地址位三个字节（总召唤，信息地址为0）（时钟同步，信息地址为0）（复位进程地址为0）（初始化地址为0）
     */
    private int address;
    /**
     * 信息元素值 必须 总召唤无此项，时钟同步无此项，复位进程无此项，初始化结束无此项，
     */
    private T value;
    /**
     * 限定词 总召唤限定词:20 复位进程限定词:1 初始化原因:0.当地电源合上，1.当地手动复位，2.远方复位 品质描述词（遥测）:0（每个信息元素后缀1个字节） "设置命令限定词 （参数预置）:参见相关文档 描述
     * 时钟同步无此项，遥信无此项，遥控无此项，
     */
    private Short qds;
    /**
     * 时标也就是时间 时钟同步带时标、总召唤无时标、进程复位无时标、初始化结束无时标、参数设置无时标
     */
    private Date date;

    @Override
    public String console() {
        StringBuilder res = new StringBuilder();
        res.append("地址:").append(address);
        if (value != null) {
            res.append("\t值:").append(value.toString());
        }
        if (qds != null) {
            res.append("\t描述词:").append(qds);
        }
        if (date != null) {
            res.append("\t信息元素时标:").append(DateUtil.format(date, DatePattern.ISO8601_PATTERN));
        }
        return res.toString();
    }

}
